home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / watcom / w_modex / fixed32.cpp < prev    next >
C/C++ Source or Header  |  1994-02-02  |  2KB  |  115 lines

  1. #include <stdio.h>
  2.  
  3. #include "fixed32.hpp"
  4.  
  5. Fixed32 SinTab[256];
  6. Fixed32 CosTab[256];
  7.  
  8.  
  9. void
  10. initFixed32(void)
  11. {
  12.     FILE *fp;
  13.  
  14.     fp = fopen("sintab.dat", "rb");
  15.     fread(SinTab, 4, 256, fp);
  16.     fread(CosTab, 4, 256, fp);
  17.     fclose(fp);
  18. }
  19.  
  20.  
  21. Fixed32
  22. FixedMul(Fixed32 num1, Fixed32 num2)
  23. {
  24.     long Mm1, Mm2;
  25.     short int MM, mm;
  26.     short int hi1, hi2, lo1, lo2;
  27.  
  28.     hi1 = (num1 >> 16);
  29.     hi2 = (num2 >> 16);
  30.     lo1 = (num1 & 0xFFFF);
  31.     lo2 = (num2 & 0xFFFF);
  32.  
  33.     MM  = (hi1 * hi2);
  34.     Mm1 = (lo2 * hi1);
  35.     Mm2 = (lo1 * hi2);
  36.     mm  = (lo1 * lo2);
  37.  
  38.     return (Mm1 + Mm2 + mm + (((long)MM) << 16));
  39. }
  40.  
  41.  
  42. Fixed32
  43. FixedDiv(Fixed32 numer, Fixed32 denom)
  44. {
  45.     return (numer / ROUND_FIXED_TO_INT(denom));
  46. }
  47.  
  48.  
  49. void
  50. CosSin(Iangle theta, Fixed32 *Cos, Fixed32 *Sin)
  51. {
  52.     *Sin = SinTab[theta];
  53.     *Cos = CosTab[theta];
  54. }
  55.  
  56.  
  57. /* ASM fixedpoint math routines
  58. ;--------------------------------------------------
  59. ; Sqrt - Fixed Point Square Root (High/Normal Precision)
  60. ;    IN     : ecx
  61. ;   OUT     : eax
  62. ;  Modified : ebx,ecx,edx
  63. Sqrt         PROC
  64.  
  65. ;This is the High Precision version for the sqrt.
  66. ;It gives the optimal 8.16 precision but takes
  67. ;a little longer (24 iterations, 48 bits intead of
  68. ;16 iterations and 32 bits)
  69.  
  70.     xor     eax,eax         ;eax is root
  71.     mov     ebx,40000000h
  72. sqrt1:
  73.     mov     edx,ecx         ;edx = val
  74.     sub     edx,ebx         ;val - bitsqr
  75.     jb      sqrt2
  76.     sub     edx,eax         ;val - root
  77.     jb      sqrt2
  78.     mov     ecx,edx         ;val >= (root+bitsqr) -> accept subs
  79.     shr     eax,1           ;root >> 1
  80.     or      eax,ebx         ;root | bitsqr
  81.     shr     ebx,2           ;bitsqr>>2
  82.     jnz     sqrt1
  83.     jz      sqrt5
  84. sqrt2:
  85.     shr     eax,1           ;val < (root+bitsqr) -> dont change val
  86.     shr     ebx,2           ;bitsqr>>2
  87.     jnz     sqrt1
  88. ; we now have the 8.8 precision
  89.  
  90. sqrt5:
  91.     mov     ebx,00004000h
  92.     shl     eax,16
  93.     shl     ecx,16
  94. sqrt3:
  95.     mov     edx,ecx         ;edx = val
  96.     sub     edx,ebx         ;val - bitsqr
  97.     jb      sqrt4
  98.     sub     edx,eax         ;val - root
  99.     jb      sqrt4
  100.     mov     ecx,edx         ;val >= (root+bitsqr) -> accept subs
  101.     shr     eax,1           ;root >> 1
  102.     or      eax,ebx         ;root | bitsqr
  103.     shr     ebx,2           ;bitsqr>>2
  104.     jnz     sqrt3
  105.     ret
  106. sqrt4:
  107.     shr     eax,1           ;val < (root+bitsqr) -> dont change val
  108.     shr     ebx,2           ;bitsqr>>2
  109.     jnz     sqrt3
  110.     ret
  111.  
  112. Sqrt           ENDP
  113. */
  114.  
  115.